// 统一处理用户相关api内部实现

package handler

import (
	"context"
	"fmt"
	"gitee.com/brookscoder/awesome-mall-go/common"
	"gitee.com/brookscoder/awesome-mall-go/common/log"
	"gitee.com/brookscoder/awesome-mall-go/dao/redis"
	model "gitee.com/brookscoder/awesome-mall-go/model"
	"gitee.com/brookscoder/awesome-mall-go/services"
	"go.uber.org/zap"
	"math/rand"
	"net/http"
	"time"

	//"gitee.com/brookscoder/awesome-mall-go/services"
	"github.com/gin-gonic/gin"
	//"go.uber.org/zap"
	//"net/http"
)

var ctx = context.Background()

/* 获取图形验证码（与手机号无关，可反复刷新） */
func GetImageCaptcha(c *gin.Context) {
	// 客户端请求后返回一个TokenId + 一张图片
	// 客户端返回后拿TokenId解密验证输入是否正确
}

/* 获取短信验证码（与手机号有关，限时请求） */
func GetSMSCaptCha(c *gin.Context) {
	// 声明接收到的变量（Get url 参数 http://localhost:8080/user/smscaptcha?phoneNum=10086）
	phoneNum := c.DefaultQuery("phoneNum", "")
	if len(phoneNum) != 11 {
		c.JSON(http.StatusOK, gin.H{"msg": "手机号位数不合法", "errorCode": common.ErrUserPhone})
		return
	}

	// 查询缓存中是否有未过期的验证码
	smscode, err := redis.ReadChptcha(phoneNum)
	if err != nil && len(smscode) > 0 {
		c.JSON(http.StatusOK, gin.H{"msg": "短信验证码未过期", "errorCode": common.ErrBusyRequest})
		return
	}

	// 生成随机数字作验证码
	rnd := rand.New(rand.NewSource(time.Now().UnixNano()))
	vcode := fmt.Sprintf("%06v", rnd.Int31n(1000000))

	// 存储到本地用作校验，并发送验证码至客户端(暂时用code,todo生成图片)
	redis.WriteChptcha(phoneNum, vcode)
	c.JSON(http.StatusOK, gin.H{"msg": "验证码请求成功", "SMSCode": vcode})
	return
}

/* 查询用户信息 */
func QueryInfo(c *gin.Context) {
	// 声明接收的变量
	name := c.Param("phoneNumber")
	println(name)
	var reqjson model.LoginRequest
	// 将request的body中的数据，按照json格式解析到结构体
	err := c.ShouldBind(&reqjson)
	if err != nil {
		log.Warning(c, "解析登录接口的请求参数不合法", zap.Error(err))
		// 返回错误信息，gin.H中封装了json数据工具
		c.JSON(http.StatusBadRequest, gin.H{"msg": "bad param", "errorCode": err.Error()})
		return
	}
	// 交给中间件处理(判断账号密码是否正确)
	model, err := services.Login(c, reqjson)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"msg": "登录接口检查未通过", "errorCode": err.Error()})
		return
	}

	c.JSON(http.StatusOK, gin.H{"msg": "ok", "data": model, "errorCode": "0"})
}

/* 查询用户信息（登录） */
func Login(c *gin.Context) {
	// 声明接收的变量
	var reqjson model.LoginRequest
	// 将request的body中的数据，按照json格式解析到结构体
	err := c.ShouldBind(&reqjson)
	if err != nil {
		log.Warning(c, "解析登录接口的请求参数不合法", zap.Error(err))
		// 返回错误信息，gin.H中封装了json数据工具
		c.JSON(http.StatusBadRequest, gin.H{"msg": "bad param", "errorCode": err.Error()})
		return
	}
	// 交给中间件处理(判断账号密码是否正确)
	model, err := services.Login(c, reqjson)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"msg": "登录接口检查未通过", "errorCode": err.Error()})
		return
	}

	c.JSON(http.StatusOK, gin.H{"msg": "ok", "data": model, "errorCode": "0"})
}

/* 新增用户信息（注册） */
func Register(c *gin.Context) {
	var req model.RegisterRequest
	err := c.Bind(&req)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"msg": "bad param", "errorCode": common.ErrParameter})
		return
	}
	model, err := services.Register(c, req)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"msg": "注册失败", "errorCode": err.Error()})
		return
	}
	c.JSON(http.StatusOK, gin.H{"msg": "ok", "data": model, "errorCode": "0"})
}

/*修改用户信息*/
func UpdateUserInfo(c *gin.Context) {

}

/*删除用户信息(注销)*/
func DeleteUserInfo(c *gin.Context) {

}
